home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
090
/
cmln1286.arc
/
BNCHMARK.ADA
/
RANDOM.ADA
< prev
next >
Wrap
Text File
|
1986-09-06
|
3KB
|
132 lines
--with SYS_DEP_TIME; -- removed for benchmark only.
package RANDOM is
--
-- Pseudo random number generating routines
-- Author: Bruce A. Bergman, Aug 1986
-- These routines are released to the public domain for personal,
-- non-commercial purposes provided authorship remains unchanged.
-- Source available from Mark Petersen's Alpo-Net FIDO board at
-- (619) 741-3412, 300/1200/2400 8,N,1
--
------------------------------
-- INITIALIZE_SEED
------------------------------
procedure INITIALIZE_SEED(seed : in integer);
procedure INITIALIZE_SEED(seed : in long_integer);
------------------------------
-- RANDOM_NUMBER
------------------------------
function RANDOM_NUMBER(high_end : in integer) return integer;
function RANDOM_NUMBER(high_end : in long_integer) return long_integer;
end RANDOM;
package body RANDOM is
--
-- Pseudo random number generating routines
--
------------------------------
-- declarations
------------------------------
a : array (0..54) of long_integer;
b : constant := 31415821;
j : integer range 0..54 := 0;
m : constant := 100000000;
z : constant := 10000;
------------------------------
-- MULT
------------------------------
--
-- Stir up bits.
--
function MULT(p : in long_integer) return long_integer is
p0, p1, q0, q1 : long_integer;
begin
p1 := p / z;
p0 := p mod z;
q1 := b / z;
q0 := b mod z;
return ((((p0 * q1 + p1 * q0) mod z) * z + p0 * q0) mod m);
end MULT;
------------------------------
-- INITIALIZE_SEED
------------------------------
--
-- Set initial seed value (overloaded).
--
procedure INITIALIZE_SEED(seed : in long_integer) is
begin
j := 0;
if seed = 0 then
a(j) := 223729; -- remove this line for actual use.
-- a(j) := SYS_DEP_TIME.get_time; -- removed for benchmark only.
else
a(j) := seed;
end if;
while j /= 54 loop
j := j + 1;
a(j) := (mult(a(j-1)) + 1) mod m;
end loop;
end INITIALIZE_SEED;
procedure INITIALIZE_SEED(seed : in integer) is
begin
initialize_seed(long_integer (seed));
end INITIALIZE_SEED;
------------------------------
-- RANDOM_NUMBER
------------------------------
--
-- Random number generator (overloaded).
--
function RANDOM_NUMBER(high_end : in long_integer) return long_integer is
begin
j := (j+1) mod 55;
a(j) := (a((j+23) mod 55) + a((j+54) mod 55)) mod m;
return (((a(j) / z) * high_end) / z);
end RANDOM_NUMBER;
function RANDOM_NUMBER(high_end : in integer) return integer is
begin
return integer (random_number(long_integer (high_end)));
end RANDOM_NUMBER;
begin
--
-- Initialize seed in case application doesn't.
--
initialize_seed(long_integer (0));
end RANDOM;